import java.util.Date

fun main(array: Array<String>): Unit {

    val total: Int = "miss is count".count()
    println("这个字符串有${total}个字符")

    val totalS: Int = "Mississippipp".count({ c: Char -> c.isUpperCase() })
    println("大写字母有${totalS}个")


    a({ a: Int -> println("函数体数据${a},仅打印不行，需要返回参数") })
    println("这个匿名函数返回的内容长度:${funcation3(1)}")
    println("这个匿名函数返回的内容长度:${autoFun()}")
}

/**
 * (Int) -> Unit  这个是函数类型。表示入参一个int类型,返回一个无类型参数
 *
 * 有名称的是具名函数
 * b 表示匿名函数的函数名
 */
private fun a(b: (Int) -> Unit) {
    //给函数属性设置入参数据
    b(1)
}

/**
 * 具名函数
 * (Int, Int) -> Unit  多入参函数类型
 * 入参  多参数匿名函数
 */
private fun b(a: (Int, Int) -> Unit){
    a(1,2)
}

/**
 * 匿名函数属性 入参是一个Int类型 返回无类型
 */
val funcation: (Int) -> Unit = {
    println("函数体数据${it},不需要返回参数")
}

/**
 * 匿名函数属性 入参无参数 返回无类型
 */
val funcation2: () -> Unit = { println("没有参数的函数体") }

/**
 * 匿名函数属性 入参是一个Int类型 函数体有返回值,返回一个Int类型
 * it 代表着唯一入参，只有在匿名函数的入参只有一个时才可以使用it代指
 */
val funcation3: (Int) -> Int = {
    println("函数体数据${it},仅打印不行，需要返回参数")
    val content:String = "miss content"
    content.length
}

/**
 * 匿名函数类型推断
 * 这里会将类型自动推断成函数类型 () -> Int
 */
val autoFun = {val a = "abc"
    val b= "dfg"
    a.length+b.length}

/**
 * 匿名函数类型推断，自动推断入参类型
 * 这里会将类型自动推断成函数类型 (Int) -> Int
 */
val autoFun2 = {a: Int ->
    val b = "dfg"
    a+b.length
}

/**
 * 匿名函数的类型推断
 */
class Person(val name: String, val age: Int)
fun a111111111(){
    val persons = listOf(Person("Jack", 11), Person("Sofie", 12), Person("Peter", 11))
    persons
        // Call a reference to Java synthetic property:
        .sortedBy(Person::age)
        // Call Java getter via the Kotlin property syntax:
        .forEach { person -> println(person.name) }
}


/**
 * 定义一个参数是函数的函数
 * @param a 普通参数
 * @param b 函数参数
 */
fun funcationAndFuncation(a:Long,b:(a:Long)->String){

    println("当前的日期格式是:${b(a)}")
}


